/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Utilidades;

import java.util.ArrayList;

/**
 *
 * @author Administrador
 */
public class  StrOp {

    public static String getNombreTag(final String str, final String sInicio, final String sFinal) {
        String nombre = borrarInicioFin(str, sInicio, sFinal);
        nombre = nombre.trim();
        nombre = nombre.split(" ")[0];
        return nombre;
    }

    public static int getCantidadDe(final String str, final char c) {
        int resultado = 0;
        for (int i = 0; i < str.toCharArray().length; i++) {
            char c1 = str.charAt(i);
            if (c1 == c) {
                resultado++;
            }
        }
        return resultado;
    }

    /**
     * Toma un tag y le quita las palabras reservadas del inicio y el fin del mismo.
     * @param str Tag a procesar
     * @param sInicio Palabras reservadas del inicio tag
     * @param sFinal Palabras reservadas del final del tag
     * @return La cadena del tag sin sus palabras reservadas
     */
    public static String borrarInicioFin(final String str, final String sInicio, final String sFinal) {
        String aux = null;

        try {
            int idx0 = sInicio.length();
            int idx1 = str.length() - sFinal.length();
            aux = str.substring(idx0, idx1);

        } catch (IndexOutOfBoundsException ex) {
            aux = str;
        } finally {
            return aux;
        }
    }

    /**
     * Separa una cadena de caracteres y le quita los corchetes omitiendo si esta entre initOmit y endOmit
     * @param str String a separar
     * @param patron patron por el cual separar
     * @param chInicio inicio del string que se pretende elminar
     * @param chFinal fin de la cadena que se pretende eliminar
     * @param initOmit comienzo de caracteres dentro de los que se omite una separacion
     * @param omitirChInicio - omitirChFinal caracteres de inicio y fin dentro de los que se omite una separacion
     * @return array con las cadenas separadas
     */
    public static String[] separar(String str, String patron, String chInicio, String chFinal, char omitirChInicio, char omitirChFinal) {
        String temp = borrarInicioFin(str, chInicio, chFinal).trim(); //Tag sin palabras reservadas ni espacios
        String[] array = temp.split(patron); //Subcadenea el String de acuerdo al patron
        String rgx = getPatronCaracteres(patron); //Le quita los corchetes al patron
        array = borrarNuloVacio(array); //Elimina los valores nulos del Vector "array"
        boolean esFinal = false; //bandera que controla si terminó

        while (esFinal == false) {
            esFinal = true;

            for (int i = 0; i < array.length && esFinal == true; i++) {
                //Si no hay una cantidad coherente de caracteres de inicio y fin y el indice es distinto al ultimo indice
                if (Balance.esBalanceada(array[i], omitirChInicio, omitirChFinal) == false && i != array.length - 1) {
                    esFinal = false; //corta el for
                    array[i] += rgx + array[i + 1];//agrega el patron sin corchetes
                    array[i + 1] = null;
                    array = borrarNuloVacio(array);
                }
            }
        }
        return array;
    }

    /**
     * @param patron patron a analizar
     * @return la cadena del patron sin corchetes
     */
    private static String getPatronCaracteres(String patron) {
        String resultado = "";
        char[] a = patron.toCharArray();

        for (int i = 0; i < a.length; i++) {
            char c = a[i];
            if (c != '[' && c != ']') {
                resultado += String.valueOf(c);
            }
        }
        return resultado;
    }

    /**
     * Elimina las palabras nulas del vector de las partes divididas de acuerdo al patrón
     * @param array Vector con las palabras divididas de acuerdo al patron
     * @return El vector que recibe como parámetro pero sin valores nulos
     */
    private static String[] borrarNuloVacio(String[] array) {
        ArrayList<String> vector = new ArrayList<String>();

        for (int i = 0; i < array.length; i++) {
            String string = array[i];
            if (string != null && string.equals("") == false) {
                vector.add(string.trim());
            }
        }
        //Como le va a eliminar los nulos, tiene que crear un nuevo vector con el nuevo tamaño sin nulos.
        return vector.toArray(new String[vector.size()]);
    }
}
